The standard way of rendering multiple shapes is to have a vertex buffer for each shape. When you want to draw lots of quads you can set your vertex buffer once and modify the world matrix for each quad you want to draw, i.e. scale, rotation, translation. It's easier to encapsulate this into a class.
I understand that you wish to use one draw call to be efficient but I would hazard a guess that mapping the vertex buffer to main memory every time you wish to change the geometry would be much more time consuming (assuming you do it often).
Direct3D does not provide a way to change the length of a vertex buffer after creation, so if you were to go down this route you would have to create extra buffers when you ran of out space.
Also I'm not sure how efficient this system would be when adding functionality to not render shapes (visibility flag), etc.
Just wanted to add a point on instancing.
You can use hardware instancing as P. Avery mentions. This would allow you to use one draw call per shape. So for instance you have a vertex buffer for a unit quad and then just use an array of matrices to transform the quad into the correct scale, rotation and position. More info can be found here on MSDN.