Be careful with that, idk what size your particle systems have on average but usually treating every single particle as a physics object will eventually be VERY slow once they get a bit bigger which is why in modern engines you'll usually find GPU simulated particles to allow for actual collision and dynamics simulation.
Agreed!
I actually got rid of the performance issue by making the shaders instantiated as static member variables inside static member functions so they get reused across all particles.
You are right though. Once you get a ton of particles on screen, things start to slow down. Therefore, I will have to implement some kind of short lifespan for the particles. But it's fun for a while to just splatter blood and gibs everywhere before it slows down.