You can change the column name by ordinal position - although this is not a robust way if the columns get reordered:
grd.HeaderRow.Cells(iCount).Text = "my column name"
There is a (liitle known? little used?)property of the header cells called AccessibleHeaderText
<asp:TemplateField HeaderText="Default Name" AccessibleHeaderText="MY_FIXED_KEY_VALUE">
<ItemTemplate>
<asp:Label ID="CustRef" runat="server" Text='<%# Bind("MyField") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Its designated for page automation so:
For iCount = 0 To grd.HeaderRow.Cells.Count - 1
Dim oCol As DataControlField = grd.Columns(iCount)
If String.Compare(oCol.AccessibleHeaderText, "MY_FIXED_KEY_VALUE", True) = 0 Then
grd.HeaderRow.Cells(iCount).Text = "my column name"
Exit For
End If
Next
Will be quite robust.
Of course you can use case or whatever for cycling though the columns
HTH