This is not a simple question - but the philosophy is simple - seek out like things and bundle them together so that the pipeline never starves for data nor stops to change gears.
Secondly, do NOT create the same thing again and again - if you have a cube, build the vertex buffer and index buffer once - use instancing, and use the world matrix to change location, size, and orientation of the cube.
If you have many cubes that never move, then preprocess them to incorporate their position in the world into their vertices proper - i.e., you are changing from project*camera*world to just project*camera
If you have many cubes that all have the same texture or material, consider bundling them all up into one vertex buffer - course this is assuming you're never going to fiddle with the geometry
Use constant buffers whenever you can - organize things so they change only when they have to - never load them with the same data all over again - sort things so that like comes through the pipeline with like
At the end of the day, your final techniques will likely be tuned to the nature of your application - you'll do what you need to do to keep those pipes flowing in the gpu as efficiently as possible