You could try this routine:
uses Grids, DBGrids;
procedure ExchangeColumns(aGrid: TDBGrid; index1, index2: integer);
var
gcols: TGridColumns;
begin
gcols:=aGrid.Columns;
if not (gcols.HasIndex(index1) and gcols.HasIndex(index2))
then Exit;
gcols.BeginUpdate;
gcols.Items[index2].Index:=index1;
gcols.Items[Index1+1].Index:=index2;
gcols.EndUpdate;
end;