sea con datatable, sea con listas, o con cualquier fuente de datos, tienes que atacar siempre dicha fuente de datos, no puedes insertar filas a un gridview directamente, sino que lo que debes hacer es asignar el DataSource y luego el DataBind() para enlazar los datos.
las columnas como tal se pueden autogenerar (viene por defecto), o puedes poner la propiedad autogenerateColumns =false y entonces por el editor de columnas del gridview las puedes modificar, poner o quitar las columnas que quieres mostrar y decir a que campo del objeto de dato apunta cada columna. Y puedes ir mas allá creando Templates para la columna que desees como se ve acá http://www.asp.net/data-access/tutorials/using-templatefields-in-the-gridview-control-vb, y ya en un template puedes poner multiples controles y hacer cosas mas elaboradas.