I would suggest using a VBO. Fill your VBO with the matrices, and pass them in using an attribute instead of a uniform. That way the VBO will distribute a new mat4 per vertex pass in the shader.

When you bind the VBO before drawing (or create a VAO for these states):

 - Enable the vertex attributes (glEnableVertexAttribArray)
 - Set the vertex attributes divisors to 0 (glVertexAttribDivisor)
 - Set the vertex attributes pointer (glVertexAttribPointer)

Have a look at how to pass a mat4 as an attribute: http://stackoverflow.com/questions/17355051/using-a-matrix-as-vertex-attribute-in-opengl3-core-profile

Hope this helps