I have done this in the past by writing my own data adapter. If you can cycle through your feature layer, you I assume you have some sort of cursor. A cursor has a list of fields. These fields have properties such as data type, length, etc. .Net datatables also have fields, called columns that are of different type. So create a new datatable, cycle through the fields and for each one create a column in the datatable with equivalent types. The cycle through the cursor, adding a row in the datatable for each row in the cursor, and set each column of the row to the value of the corresponding field in the cursor row. The bind the datatable to the datagridview. If the user is going to edit the datagridview, you are going to need to write the code to put the changes back into the featureclass.
It is a little tedious and the performance is lackluster but it works. Watch out for the nullable property on the field. If the cursor is created with an outer-join query, the field reports the nullable value of the base table, which could not allow null value and could very well have null values in the cursor for that field (due to the outer-join.) I remember getting snagged by that because we created a column that doesn't all null values, then tried to cram null values into it and got an exception.