Wouldn’t call that hacky. TArray is not an UCLASS/USTRUCT, so when you nest them, property system won’t be able to pickup 2nd level TArray. So, wrapping things into UStruct seems like a fairly obvious choice.
Oh, and representing 2d array as 1d is a good idea. Array of Array of X (or vector of vector of X) only really makes when your rows can have different lengths. You could also add blueprint accessor to that, if you wanted.