TDrawGrid by itself is "virtual" in the sense that it does not store any data (like the TStringGrid does). There are some administrative lists which scale with the number of rows, but I think if this can be avoided - even the VirtualTreeView has administrative data per node.
I played with the attached project having 1 million rows in a TDrawGrid, and I can crank up the row count up to 20 millions and do not see a memory overlfow even when running inside the 32-bit IDE. My system has 32 GB RAM, only 4 can be used in 32-bit, and I don't know how much is reserved for OS and IDE and others.
My demo just draws some number in the cells which is derived from the column and row indices - no additional data is required for this. But in real life, you want to display something which is stored somewhere - and this needs memory, too, probably more than the administrative data used by the grid.
So, it all boils down to memory requirement and memory availability. Why don't you compile your application to 64-bit? I could build and run the test project with 50 millions of rows in the 64-bit IDE, but initialization time for the grid becomes very noticeable then since it seems to grow quadratically with row count (50 millions of rows --> 25 sec, 25 milions of rows --> 5 sec).
From a usability perspective, displaying so many rows is nonsense, nobody will capture this information. Think about more conceivable ways to display your data.