Nvidia has an extension for creating command buffers in modern GL.
The reason for the lack of similar functionality is that there is a lot of state involved regarding how to render and the display list be affected by a lot of different state. For example changing the blend state requires patching the fragment shader on some hardware.
NVidia solved it by capturing all state and reseting to the state after a dispatch:
1) What motivates the design?
The primary goal is to be able to reuse pre-validated command buffers.
Other APIs and proposals have addressed this with various incarnations
of command lists or state objects, but a recurring problem is that
interactions between various stages of the pipeline prevent this
prevalidation and reuse. These interactions are often
hardware-specific (and differ from vendor to vendor or even
generation to generation) and new interactions are introduced by new
features that were not imagined when the prevalidation scheme was
We attempt to address this by having a monolithic state object that
encompasses (almost) the entire state of the pipeline. This should
provide enough information for all implementations to do any needed
cross- validation. We try to create these in a way that minimizes the
new API footprint - since we want ALL state (including any added in
the future), we just capture it from the current state of the context.
23) In what condition is the state left, that is modified by tokens,
after the dispatch call?
RESOLVED: state is reset.
(from the extension text linked above)
However the true successor is the command buffer functionality in DX12 and vulkan. Those will also capture all render state into a single object to use when creating and filling the command buffer. The NVidia extension is based on that architecture as a result of NVidia's involvement in the Vulkan design.