Try this.
//set the datasource to generate the internal columns
this.gridDataBoundGrid1.DataSource = dt;
//modify the internal columns somehow...
GridBoundColumn gbc = this.gridDataBoundGrid1.Binder.InternalColumns[1];
gbc.HeaderText = "Column 1";
//save the internal columns
int count = this.gridDataBoundGrid1.Binder.InternalColumns.Count;
GridBoundColumn[] gbcs = new GridBoundColumn[count];
for(int i = 0; i < count; ++i)
gbcs[i] = this.gridDataBoundGrid1.Binder.InternalColumns[i];
//add the save columns as GridBoundColumns
this.gridDataBoundGrid1.GridBoundColumns.AddRange(gbcs);
You have to save the internal columns to be able to later use them as the first time a column is added to GridBoundColumns, the InternalColumns are zapped.
Attached is a little sample that rebinds the grid to a table.Clone when you press the button without losing the title set in teh grid bound column.