With regard to the different faces of the cube getting rendered problem, I've found that that some of the faces in the CreateTestCube() method do not obey the clockwise winding rule that was briefly talked about in the article. If you want to see these faces correctly you have to do a couple of things...

First you have to fix up the offending faces so that when the camera is looking at each face from outside the cube, the vertices that form each individual triangle trace out a clockwise path.

Second, since back-face culling is currently turned off you have to turn it on and set it to cull faces that have counter-clockwise orientation (imagine being inside the cube and trying to look out...all of the faces will be oriented the wrong way so wont be drawn etc). To do this, replace line 108 with

device.RenderState.CullMode = Cull.CounterClockwise;

If you do these two step you should get a normal-looking spinning cube that only shows the faces that are visible to the camera and not obstructed by the rest of the cube.

Without making these changes what you get is an attempt to draw the cube without any knowlege of what faces/colours should be on top of each other. If you run it again without culling turned on you'll notice that the last colours defined in the function that generates the cube are the colours that are on top and hence drawn most often, and the first colours are generally obscured (that is, you get more purple and red than aqua and yellow).

In case anybody is interested, here is my modified code for constructing the triangles so that they obey the clockwise winding rule.

// face 1
verts[0].Position = new Vector3 ( 0.0f, 0.0f, 0.0f );
verts[1].Position = new Vector3 ( 0.0f, 10.0f, 0.0f );
verts[2].Position = new Vector3 ( 10.0f, 0.0f, 0.0f );
verts[3].Position = new Vector3 ( 10.0f, 0.0f, 0.0f );
verts[4].Position = new Vector3 ( 0.0f, 10.0f, 0.0f );
verts[5].Position = new Vector3 ( 10.0f, 10.0f, 0.0f );
// face 2
verts[6].Position = new Vector3 ( 10.0f, 0.0f, 0.0f );
verts[7].Position = new Vector3 ( 10.0f, 10.0f, 0.0f );
verts[8].Position = new Vector3 ( 10.0f, 0.0f, 10.0f );
verts[9].Position = new Vector3 ( 10.0f, 0.0f, 10.0f );
verts[10].Position = new Vector3 ( 10.0f, 10.0f, 0.0f );
verts[11].Position = new Vector3 ( 10.0f, 10.0f, 10.0f );
// face 3
verts[12].Position = new Vector3 ( 0.0f, 0.0f, 0.0f );
verts[13].Position = new Vector3 ( 10.0f, 0.0f, 0.0f );
verts[14].Position = new Vector3 ( 0.0f, 0.0f, 10.0f );
verts[15].Position = new Vector3 ( 0.0f, 0.0f, 10.0f );
verts[16].Position = new Vector3 ( 10.0f, 0.0f, 0.0f );
verts[17].Position = new Vector3 ( 10.0f, 0.0f, 10.0f );
// face 4
verts[18].Position = new Vector3 ( 0.0f, 0.0f, 0.0f );
verts[19].Position = new Vector3 ( 0.0f, 0.0f, 10.0f );
verts[20].Position = new Vector3 ( 0.0f, 10.0f, 0.0f );
verts[21].Position = new Vector3 ( 0.0f, 10.0f, 0.0f );
verts[22].Position = new Vector3 ( 0.0f, 0.0f, 10.0f );
verts[23].Position = new Vector3 ( 0.0f, 10.0f, 10.0f );
// face 5
verts[24].Position = new Vector3 ( 0.0f, 0.0f, 10.0f );
verts[25].Position = new Vector3 ( 10.0f, 0.0f, 10.0f );
verts[26].Position = new Vector3 ( 0.0f, 10.0f, 10.0f );
verts[27].Position = new Vector3 ( 0.0f, 10.0f, 10.0f );
verts[28].Position = new Vector3 ( 10.0f, 0.0f, 10.0f );
verts[29].Position = new Vector3 ( 10.0f, 10.0f, 10.0f );
// face 6
verts[30].Position = new Vector3 ( 0.0f, 10.0f, 0.0f );
verts[31].Position = new Vector3 ( 0.0f, 10.0f, 10.0f );
verts[32].Position = new Vector3 ( 10.0f, 10.0f, 0.0f );
verts[33].Position = new Vector3 ( 10.0f, 10.0f, 0.0f );
verts[34].Position = new Vector3 ( 0.0f, 10.0f, 10.0f );
verts[35].Position = new Vector3 ( 10.0f, 10.0f, 10.0f );