Show image on button
You can add a DataGridViewButtonColumn , then handle the CellPainting event of the grid and check if the event is triggered for the column of your button, and then draw an image on it. At the end of the event, be sure to set e.Handled = true; .
In the code below, I assume that you have an image resource, for example, someImage :
private void grid_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { if (e.RowIndex < 0) return;
Show image without button
To show one image in all rows, including a new one, you can set the Image property for DataGridViewImageColumn . Thus, the image will be displayed in this column for all rows:
dataGridView1.Columns.Add(new DataGridViewImageColumn(){ Image = someImage, Name = "someName", HeaderText = "Some Text" });
Also, if you want to have different images for cells, you can set the formatted value of the DataGridViewImageColumn in the CellFormatting event:
void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (e.RowIndex < 0) return;
You can also set the Image property for the DataGridViewImageColumn to an image, but the image will not be displayed on a new line.
Pen press
To process Click on the image / button, you can process the CellClick or CellContentClick :
void grid_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0) return;
If you processed CellContentClick , you must click the image exactly when using the image column.
Screenshot
Here is the result. The first column is the column of the button with the image, and the second column is the column with the normal image, configured to display a single image:

Important note
In the above examples, I assume that you have an image in someImage member variable:
Image someImage = Properties.Resources.SomeImage
Make sure you recycle someImage when disposing of the form, and avoid using Properties.Resources.SomeImage directly wherever you need to.