If your data pool is very large, display lists isn’t the way to go :
Displays lists are stored in special pre-compiled format, so Creating one huge display list will fill your memory. You probably won’t be able to make everything fit into memory, and there will be a lot of swapping.
The best way to go is common sense, is trying to figure out wich data is visible (using the techniques that suits your need) and using compiled vertex arrays. That way you reduce the geometry you have to calculate and using vertex arrays will cut down from the time it would take to compile a small display on that chunck of data and having the vertex compiled will help you do multipass if you need to.
As for changing states, well you need to sort your data by texture, materials and other effects to minimize state changes