So it’s essentially a sparse image, with sparsity only in XY? The solution is going to depend on how you want to visualize it. Typically, VTK uses vtkUnstructuredGrid to represent sparse data but that’s not ideal (especially for volume rendering). It almost sounds like you want something like a masked vtkImageData.
Probably the most straightforward thing it to create a vtkImageData, and set all the unused values to some special value that doesn’t appear anywhere in your data. For example, for 16-bit data a value of -32678. For float, you could even use NAN. Then, when you display the data, use a lookup table that maps your special value to “transparent” (i.e. alpha value of zero). This might not work perfectly due to interpolation, but it might be worth a try.