Cuando dices posición, te refieres a la columna, no? Las columnas provienen únicamente de la fuente de datos o tienes columnas con botones, etc.?
Lo de llenar el grid manualmente supongo que te refieres que generas el origen de los datos y luego se lo asignas al DataSource. Es así?
Puedes revisar
este sencillo ejemplo, para hacerlo mediante un DataTable.
Yo suelo crear una clase con todas las columnas que quiero que tenga el grid. Luego creo una
lista genérica (List<>) con objetos de esa clase que relleno. Y finalmente le asigno la lista al DataSource.