etwas um die Ecke gedacht realisiert man das z.B. intern als Hash mit einem Key, welcher sich eben aus den verketteten "beliebigen Dimensionen" zusammen setzt.
Nehmen wir als Beispiel das ganze als StringHash:
setzen: sh.Add(IntToStr(x)+'-'+IntToStr(y)+'-'+IntToStr(z), stringvalue)
lesen: stringvalue := sh.Get(IntToStr(x)+'-'+IntToStr(y)+'-'+IntToStr(z));
Das ist vom Speicherplatz her optimal, weil übersprungene X,Y,Z-Indexwerte keinen Speicherplatz verbrauchen und geht auch fix.
Das Ganze schön in eine Klasse gepackt und Zugriff per PropertyValue[x,y,z] und schon sieht es aus als wärs eine Array