I think there are several different ways of doing this – you could interrogate the material of the object and based on that you could spawn the correct effect.
Another way might be to create an interface (“IShootable” for example) that accepts a position and a normal as a point at which something was shot. When you hit something, you would attempt to cast it to IShootable, and if this succeeds, you would then send the object an “OnShot” function with the position and normal of the hit (from the trace). Each object that implements IShootable defines its own (different) particle effect, which it would then spawn at the position/normal sent into the OnShot function.
Blueprint Interfaces are described in this video: