Indeed, a reversal of the first level of the data is needed in ListPlot3D. The documentation page of GeoElevationData uses the construction ListPlot3D[Reversed[data], ...]
in its examples. This is a question of conventions used, and we always have to take into consideration which convention is being used by each function. Take for instance this data:
data = GeoElevationData["World"];
and compare the results of these two:
ArrayPlot[data]
ReliefPlot[data]
We see that different functions interpret the data differently, and we may need to reverse the data (with Reverse, or the option DataReversed, or the ScalingFunctions value "Reverse" as you did).