Meshes upside down (invisible).

Hi I am creating a set of meshes by code but they all seem invisible when viewed from the top, if you look them from below you can see them clearly, here is an example :

From underneath :

Any help as to why is this happening? Also my textures do not seem to be spreading across the surfaces of my mesh…so if you could help me with that as well…

Here is my source code :

public class Tetrahedron : MonoBehaviour
    {
		List<Vector3> vertices = new List<Vector3>();
		List<int> triangles = new List<int>();
		List<Vector2> uv = new List<Vector2>();
		List<Vector3> normals = new List<Vector3>();
		    public bool sharedVertices = false;
		
		    public void Build(Center c){
			MeshFilter meshFilter = GetComponent<MeshFilter>();
			MeshRenderer renderer = (MeshRenderer) meshFilter.renderer;

			if (meshFilter==null){
				Debug.LogError("MeshFilter not found!");
				return;
			}
			
			Mesh mesh = meshFilter.sharedMesh;
			if (mesh == null){
				meshFilter.mesh = new Mesh();
				mesh = meshFilter.sharedMesh;
			}
			
			renderer.material = Resources.Load("Grass",typeof(Material)) as Material;
			foreach (Triangle t in c.Polygon.tris) {
				t.vertices.Select(b => b.Position).ToList().ForEach(x => vertices.Add(fix (x)));
			}
			mesh.vertices = vertices.ToArray();
			
			System.Random rand = new System.Random();

			triangles = new List<int>();
			int i = 0;
		     
			foreach( var v in vertices)
			{
				triangles.Add(i);
				i++;
			}
			mesh.triangles = triangles.ToArray();
            uv = new List<Vector2>();
			vertices.ForEach(b => uv.Add( new Vector2(1,1)));
				// basically just assigns a corner of the texture to each vertex
			mesh.uv = uv.ToArray();//new Vector2[vertices.Count];// uv.ToArray();

			//c.Normal.Normalize();
			var nomalized =c.Normal;
			nomalized.z *=-1;

			vertices.ForEach(b => normals.Add( nomalized));

			mesh.normals = normals.ToArray();
			//mesh.RecalculateNormals();
			mesh.RecalculateBounds();
			mesh.Optimize();
		}
		// Use this for initialization
		void Start () {
		}
		
		// Update is called once per frame
		void Update () {
		}

		public Vector3 fix(Vector3 v3)
		{
			//v3.z *= -1;
			return v3;
		}
    }

The order in which you supply vertices to the triangle array determines which direction the triangles will face. Clockwise (0,1,2) will be forwards facing and anti-clockwise (2,1,0) backwards. You just need to reverse the order of the indices.