Each light has a shadow map (which can be thought of as "the depth of the scene, from the point of view of the light").
During the final rasterization pass, the shadow map is sampled. If the sampled depth is less than or equal to the current fragment's depth, then the fragment is in light; otherwise it's in shadow.
So, nothing has fundamentally changed here. When a particle (voxel) is rasterized, it outputs a depth, just like a triangle outputs a depth.
tl;dr: Dynamic shadows work fine.