Du könntest dir ein dynamisches Array aus einer Semi-Struktur zusammenstellen, in etwa so:
Delphi-Quellcode:
type
TSemiRec = record
Data: Pointer;
DataType: TDataType;
end;
Wobei DataType angibt, was genau Data^ enthält.
Du könntest aber auch Variant-Arrays benutzen..
Aber zu deiner anderen Frage: Die Möglichkeit der Änderung eines Typs zur Laufzeit besteht nicht.