For the shape of the smoke :
What you can do is create a geo shape that will be the source of your smoke. eg: When i did cannon fire i had make a line, transformed it and copied a bunch around the origin of the line, which gave me a cone like appereance and then i just added some noise on it to make it a little curly.
Then I gave it some density and velocity using a VOPSOP and then used the cluster points node. This node automatically gives you cluterpoints and averagepoints. I used the averagepoints to make a bounding box for the curly lines geo for smoke and used the fluid source to make a volume out of it and put that into the sim.
Remember you have to source the bounding box in the smoke object which you use in the sim. I used the resize also but sometimes its good not to use the resize since it messes the smoke shape.
And i think this method itself will prevent the mushroom shape you are talking about
Then you can do all sorts of things like wind and drag to your smoke in the DOP network and manage the look of the smoke with the solver, I used a Pyro solver.
For controlling the emmision time of the smoke I used Python, gave it a fire frame attribute, and made a digital asses out of it so that you can just enter the frame you want the cannon to fire.
I hope this helps!
Yash