Unless the tag somehow contains moment-to-moment volume data for the song (instead of a single field representing a single relative volume number), then your assesment is correct. It's a single volume adjustment, not dynamic compression.

It doesn't need to. You only need to know:
1) the volume of what you're playing now. A volume adjuster inline in the kernel already does (e.g. voladj).
2) the maximum and minimum present in the track, e.g. the current range
3) the target range (at which point you can calculate an adjustment factor)

The range compression can be dynamic: you need only to plug the necessary factor into whatever equation you're running on the gain in the real time play path, and update said value on a song switch.