Short answer: You want to use the volume scatter shader for this, not absorption. (or use the post-pro workaround in the other answer).
Ok, let's back up a bit and I'll try to explain why Cycles produces the values it does with the absorption shader: First of all, the volume absorption shader does not add energy to the ray or add contributions for a light in any way, it can only remove them. This is because absorption does not alter a ray's path, it merely removes energy from it. With transparent film, it's subtracting from the already black background, thus leaving you with a black smoke plume. "But wait!" you're probably saying, "my background isn't black, it's white!"
Oh boy. What a fun can of worms we got into here. So when you're rendering with a transparent background, you need to make the RGBA color of the background black. The reason for this is how the alpha over operation (or "normal" blend mode in Photoshop parlance) works. You can read the formula here: https://en.wikipedia.org/wiki/Alpha_compositing If you look closely, you can see what it does is multiply one layer by the alpha (blacking out the transparent portions) and multiply the other by the inverse of the alpha (blacking out opaque portions) then sums the results. So the function of the alpha channel in this case is to tell the software what part of the existing background to remove to allow the new background to be added.
This works just fine for 100% transparent sections no matter what else you mess up along the way (like writing the RGB channels as non-zero). It's partially transparent areas where the problems start. The non-zero RGB values in the background represent incoming energy from the background, which you do not actually want. You're providing different energy values later by way of comping in your final backplate. When you have a partially transparent region though, you want to preserve some energy (the energy reflected by the occluding object), so rays returning the value of the occluding object have non-zero RGB and an alpha value of 1. (ok, they might have RGB=0 if the occluder is black, but let's just assume it's not). Rays that continue to the background have an alpha of 0, thus the average alpha provides the proper scaling factor so the right amount of composited backplate energy is left on the pixels.
But what if those backplate rays came back with a non-zero RGB? The alpha channel does not distinguish between colors from the occluded object and colors from the backplate, it just represents how much energy is supposed to pass through the occluder. Thus, you get an unnatural glow as you are stacking the energy of the render background and final composited backplate, where this wasn't supposed to happen. Oh yeah, and because of antialiasing all objects get a partially transparent region around their edges, so even opaque objects get a halo if you don't black out this background.
And all this glowy mess isn't fixable in post either, at least using just the main beauty pass. If you have an occluded environment AOV (like cycles' environment pass) you can subtract that from the beauty pass and straighten things out, but no messing with a "convert premultiplied" switch will do the job.
This is all fairly arcane, so to make it easier on the user when you enable transparent film Cycles just stops all camera-ray contributions of the world background, forcing it to return RGB=0 in all cases. Your volume absorption shader tries to remove energy (especially red and blue energy) from a ray that has no energy to begin with, thus your smoke is black. Using the scatter shader instead causes it to REFLECT green light, thus remaining visible on its own. If you'd rather have the glowy green look, you can also specify that directly using the emission shader instead of, or in addition to, the absorption shader.