What you're doing is essentially the way I do it.
Here's a detailed example of one of mine, done in the Sovereign-class style.
It starts with a circle with a specific number of vertices depending on how thick I want the beam emitter insets to be, the width of which I then carry forward into the various segments that span the length of the strip. I tend to just default to 3 meters for the width of a phaser strip, based on the TNG Technical Manual and visual scaling from various screenshots. Each emitter notch is somewhere between 20 and 30 cm wide (again, based on visual scaling of the number of notches compared against other features with known size), so I generally go with a circle with 56 edges or so, for 28 per cap, and then use two segments per cap emitter, so the end up being a hair over 30 cm around the periphery, but shrink down to the right size after insetting (will get to that in a moment).
Of course, I do all of this because I ridiculously overthink everything and this level of nonsense is not necessary for most people.
It's important to make sure the semicircle "cap" part is angled well in comparison to the average normal of the hull surface it's going to snap to, or you'll get some weird distortion and the cap will end up looking correctly round from one angle, but stretched or squashed from others. Shrink Wrap might actually handle this better than simply turning on Snapping with Face as the Snap Target, which is what I normally do.
Create enough subdivisions in the polygon that connects your two end cap semicircles so that it roughly matches the emitter width established earlier, then snap the mesh to the face to get your base phaser geometry. The number of subdivisions is important here, though, because you're going to need the "pattern" to work out later. Make sure you go with an even number.
At this point, I use Inset Faces to create the contour shape, following this pattern:
Written out as instructions:
_ ~.5m across | bevel edge at 0.025
_| 0.0785m inset | 0.0785m shallow extrude | bevel base at 0.01 | bevel slope edge at 0.025
_/ .21m (7%*3m) inset | 0.554m up, .96m (32%*3m) in (makes 30° incline)
| 0.5m, bevel top at 0.1
- Inset Faces with Depth 0.5 (extruding "out") on the base curve. In truth, it's usually better to Inset Faces "up" 0.25 and "down" 0.25, so you give yourself a little slack at the hull intersection. Only 0.25m sticks out of the hull in my screenshot above.
- Inset Faces on the "outer" polygons 0.21m.
- Inset Faces on these polygons again, using 0.554m "up" and 0.96m "in" to make the actual phaser bulge
- Inset Faces on the top ridge another 0.0785m in
- Inset Faces on these polygons another 0.0785 up
- Select all of the angled edge loops and bevel them with a small bevel. You can vary it per edge (as in the notes above) or just choose a single value that looks good (I usually end up doing this)
The final step is to go through and -- one-by-one -- stagger-select the emitter polygons (remember to select pairs of them on the caps, since they're two faces per actual emitter width), then run Inset Faces twice: first with a small inset of 0.02m in, 0.01m "down" to create a nice micro-bevel, then with a large depth inset of 0.05m in, 0.25m "down" to create the emitter well itself.
That's just one visual style, though. Depending on the era you're going for, there are all sorts: Intrepid style, Galaxy style, Sovereign style (what the above are based on), etc.
One method I'm curious to try at some point in the future, to do something like the Galaxy style shown above, is to combine a single modeled segment and a Bezier curve with the Array and Curve modifiers, to get that sort of high-detail emitter notch look without going out of my mind.
Hope this helps!