Yes, both of the methods you described should work.
if you want
real projectiles take a look at
Glider's Grenadier.
But tracking bullets hit is probably the best & easiest way.
example:
HookEvent("bullet_impact",BulletImpact);
public BulletImpact(Handle:event,const String:name[],bool:dontBroadcast)
{
new Float:Origin[3];
new client = GetEventInt(event,"client");
Origin[0] = GetEventFloat(event,"x");
Origin[1] = GetEventFloat(event,"y");
Origin[2] = GetEventFloat(event,"z");
// TE_SetupExplosion..... :D
}