The databinding supports any IList or IListSource object. The only information for such general data source is the PropertyDescriptor. So, the HeaderText is initialized with the PropertyDescriptor.Name property. This is why things work as they do in a GridDataBoundGrid and in a DataGrid.
That said, it would be possible to add checks for particular datasources to make use of additional properties that might be available. But just changing this functionality at this point would break the behavior of existing code. So, any changes would have to be implemented on a conditional basis.
As a workaround, you could add the method below to your form and just call it after you set the datasource to the grid. This would allow you to control the headers just by setting the column captions.
public void SetCaptionIntoHeaderText(DataTable dt, GridDataBoundGrid grid)
{
GridBoundColumnsCollection gbcc = grid.GridBoundColumns;
if(gbcc.Count == 0)
gbcc = grid.Binder.InternalColumns;
if(gbcc.Count > 0)
{
foreach(GridBoundColumn gbc in gbcc)
{
DataColumn dc = dt.Columns[gbc.MappingName];
if(dc.Caption.Length > 0 && !dc.Caption.Equals(gbc.HeaderText))
{
gbc.HeaderText = dc.Caption;
}
}
grid.RefreshRange(GridRangeInfo.Row(0));
}
}