Ahí va una idea:
Antes de presentar el dbgrid o el informe podrias calcular el máximo número de partes que vas a obtener.
Una vez obtenido el número de columnas que vas a necesitar solo tendrías que montar una query añadiendo las columnas necesarias.
Por ejemplo, esto funcionaria en sqlserver. En mysql creo que es parecido,
Código SQL
[-]SELECT COUNT(ID_PARTES) FROM PARTES_CONTRATO WHERE ID_CONTRATO IN("LISTA DE CONTRATOS")
Código SQL
[-]
select id_contrato,
case when id_parte=1 then ID_EMPRESA else "" end,
case when id_parte=2 then ID_EMPRESA else "" end,
.....
case when id_parte=numeropartes then ID_EMPRESA else "" end,
FechaFirma, FechaEntradaVigor, Objeto, IdTipoContrato
from contratos a
inner join PartesContrato b on
a.id_contrato=b.id_contrato
where a.id_contrato in(..lista de contratos..)
Esto lo puedes ir formando en un query y así obtener de forma dinamica las columnas que necesites. De esta forma el contrato con el máximo numero de partes tendría todas las columnas rellenas y los restantes columnas en blanco donde no existiese el id_parte.
Todo esto se puede hacer siempre y cuando el ID_PARTE sea secuencial.
Espero haberte ayudado en algo.