Mapping with WRITE_DISCARD invalidates the contents of the buffer, so you'll have to update the entire buffer as you do in the second method.
You're effectively given a new buffer, which avoids stalls when the GPU is still using the resource.
You (incorrectly) pass a member of the D3DPOOL enumeration as the Usage argument to D3DXCreateTextureFromFileEx. This function has a return value that could tell you a lot about what you could be doing wrong.
I don't know the exact implementation of these math functions, but you should check whether CreateFromAxisAngle() requires a normalized vector as input (which rotationAxis = Vector3.Cross(lookAtDirection, forward) likely isn't).
MathUtilities.GetUnsignedAngle() seems to throw out the sign of the angle, but in the code that follows you recalculate it:
Vector3 right = Vector3.Normalize(transformComponent.Transform.Right);
But is it important? Point will be added several times (for each rectangle) but with same texCoords...
It may be. When you iterate over all the points (for (int j = 0; j < list.Count; j++)), including the duplicates, they may no longer match up with what you have stored in 'elements[i].valueOnPoint' when you index it with 'j'.
There are mustn't be 4 different corors around 1 vertex. Oposite, there are must be one color on the 4 quads (near this vertex)
Perhaps it's best if you post the code that shows how you set up the quads' vertex positions and their accompanying temperature-texcoords. Like said before, it's probably something in there that's causing these unwanted discontinuities.