1. bind shader
2. upload matrix for object 1
3. draw object 1
4. upload matrix for object 2
5. draw object 2
No need for a separate shader program. All you need is to update the model matrix (or model-view-projection combination matrix) for each model.
This is, however, the most unoptimal way to do it. You could also use a uniform buffer object to store all objects' model matrices and then lookup the respective matrix needed for a particular object via a vertex attribute that you advance per object.
This would allow you to draw all objects (capped by the maximum UBO size, of course) with a single draw call.
There are many more possibilities, such as using instancing and storing only the individual objects' translations as instanced vertex attributes (in case where the objects' transformations only differ in translation and not e.g. in rotation and scaling).