Since QGIS 2.12, with the introduction of data-defined properties on the "lock layers for map" option, in the map item properties, you can do what you seek. You just need to create the right coverage layer, with the information of the extents, but also of the layers to "print".
Create the layer presets
You can "save" the current state (visible or not visible) of your layers as presets. Just create the desired combination and press the eye icon on the layers panel, and choose "add preset".
Basically, you will have to create a preset for each contour, with that layer visible (paired with other layers if you like). This will be your "set of layers".
Give your preset memorable names, or else just opt for some kind of a sequence.
Creating the coverage layer.
Now you will have to create a polygon layer with all the possible combinations between the extents polygons, and all the presets. That means you will end up with some redundancy. You will have to replicate each extent polygon for each preset. Something like this:
polygon 1, preset a
polygon 1, preset b
...
polygon 50, preset a
polygon 50, preset b
You can do this manually with copy paste, or else create some kind of script, but I would say your best and easier way would be using Spatialite or Postgis database. Just import you polygons extents there, and create a new non-spatial table with all presets names. Then, create a view that returns all the combinations.
SELECT f.*, g.preset_name
FROM polygons_extent as f, presets as g
Making it work
Add the new layer or view to QGIS, use it as coverage layer in atlas settings, and use the preset_name attribute in data-defined properties on the "lock layers for map" option.
Best Answer
I think I have this figured out! Thanks to Miro for pointing me to some relevant past qs. This is largely building on the script from this question: https://stackoverflow.com/questions/27033261/import-csv-into-qgis-using-python. This assumes that (1) you have a style .qml file in the same folder as all the .csvs and it's called style.qml; (2) that the csvs are numbered (in this case from 1250 to 1550) and each just called "x.csv"; (3) that you have a composer manager template made and open, with a label selected which will change to display the frame number. It creates images each named "frame x.png" in the same folder. Here's the code: