You should read the faq, but here is a cut n paste from the msdn OpenGL documentation about what commands you can’t use in a display list:
“Certain commands are not compiled into the display list, but are executed immediately, regardless of the display list mode. These commands are glColorPointer, glDeleteLists, glDisableClientState, glEdgeFlagPointer, glEnableClientState, glFeedbackBuffer, glFinish, glFlush, glGenLists, glIndexPointer, glInterleavedArrays, glIsEnabled, glIsList, glNormalPointer, glPopClientAttrib, glPixelStore, glPushClientAttrib, glReadPixels, glRenderMode, glSelectBuffer, glTexCoordPointer, glVertexPointer, and all of the glGet routines.”
“Similarly, glTexImage2D and glTexImage1D are executed immediately and not compiled into the display list when their first argument is GL_PROXY_TEXTURE_2D or GL_PROXY_TEXTURE_1D, respectively.”
Instead of using the glVertexPointer and other commands related to glDrawElements inside of a display list generation, you should use the glBegin(GL_TRIANGLE) … glEnd(); functions. Do this once for the static polygon data during your initialization with GL_COMPILE for glNewList argument instead of GL_COMPILE_AND_EXECUTE. Then simply call glCallList(displayListIndex) in your rendering function.
If you wan’t to use the glDrawElements function call, forget about display lists and simply call every frame the needed glVertexPointer, glNormalPointer etc to setup the per vertex information and call glDrawElements after that. The performance should be good enough for starters and if you wan’t to get more performance start looking up the vertex array range extensions for Nvidia boards and Atis corresponding.