Hola, yo tengo una función que me crea los campos lookup . Igual os puede ayudar.
Por otro lado, creo que hay que asegurarse de que el DBGrid debe abrirse posteriormente a la creación del campo, ya que si no no estará disponible.
En su día yo tuve problemas con la generación de estos campos en ejecución, y tuve que asegurarme de que el campo se generaba bien recorriendome el dataset y mostrando los campos que tenía.
Saludos
Código Delphi
[-]
procedure TForm1.CrearCAmpoLookup(Query: TMDOQuery; Campo, CAmpo_FK, tabla_FK, SQL: string);
var campow: Tfield;
begin
Campow:= TStringfield.Create(nil);
CAmpow.Fieldname:= SQLTAblas.FieldByName('NOMBRE_SI_FK').AsString;
Campow.FieldKind:= fkLookup;
Campow.Dataset:= Query;
CAmpow.DisplayLAbel:= SQLTAblas.FieldByName('LABEL_SI_FK').AsString;
CAmpow.DisplayWidth:= 40;
Campow.LookupDataSet:= ClonarDataset(SQLFK,
['database','transaction'],
SQL);
Campow.KeyFields:= Campo;
Campow.LookupKeyFields:= Campo_FK;
Campow.LookupDataSet.Open;
Campow.LookupResultField:= CAmpow.LookupDataSet.Fields[1].FieldName;
end;