Open a new file and make a couple objects, give them a few particle systems each. Make and assign a few unique materials to each new particle system's material (under the render menu of the particle system tab) to a different material. Now check out the datablocks menu of the outliner and view particles. Notice that the material slot of each system will only be populated with materials from the active object (regardless of which particle system you are viewing). Is this supposed to be this way? Because when querying bpy.data.particles (which stores each particle system's settings into what I thought was a library) when you access each of these setting's material slots "bpy.data.particles[0].material_slot" they'll only be populated with materials from the active object and not the ones they belong to.
Also if you run the below code. Notice that only the material slots belonging to an active object will print. It's clear that one space for each of the total particle settings stored in bpy.data.particles is being printed, but only the material slot data from the active object is being used to supply the material slot names.
import bpy
for settings in bpy.data.particles:
print( settings.material_slot)