See the question and my original answer on StackOverflow

DataGridView.Dispose() doesn't do much about the datasource (and its underlying data), it's more focused on disposing graphical (GDI+) objects, visual columns, cells, pens, brushes, etc. But it has a reference on it.

So, what you need to reduce memory is ensure nothing holds a reference to the DataTable (the instance you created) anymore. There are many ways to do it, it depends how your objects are created, what instance references what, how they go out of scope, etc.

The most simple solution is to close the 2nd form, then, dataGridView1 will not be referenced anymore (it was referenced by the 2nd form), same for its DataSource instance. Then you can run your GC collection code.