You should probably use the built in paging features of the GridView class (see ^
That's a lot of data for a web page, think about it:
Let's assume you only have one column, each entry empty, and the encoding is UTF-8
The GridView will generate a table, each row needs "<tr>" and "</tr>" (9 bytes), and each item needs "<td>" and "</td>" (9 bytes), so:
20000 * (9 bytes per row + 1 item per row * 9 bytes per item) = 360,000 bytes, just for the markup with one column. But your data probably has more columns, and the values of your entries each add to that data. That's a lot of data to transfer all at once, and it will be slow. If you page it, you only have to send them a little at a time, and it will be much faster.