Why can we contract an upper index with only a lower index? Why can't we contract two upper or two lower indices?
Can you explain this with the help of matrices?
Moreover, how can we represent the operation of a (0,2) tensor on vectors with a matrix?
 A: The basic reason is because we've generalised the usual inner product to include metric tensors other than the Kronecker delta. So instead of the squared length of the vector $x$ being $\sum_i (x^i)^2=\sum_{ij}\delta_{ij}x^ix^j$ as in Euclidean space, we can replace $\delta_{ij}$ with a real symmetric matrix $g_{ij}$. If this matrix has a mixture of positive and negative eigenvalues, as happens e.g. in special and general relativity with both space and time dimensions, a real rotation can't restore the Kronecker-delta metric, because the manifold isn't Euclidean. And even if you're working in a coordinate system that uses a Kronecker delta now, a coordinate transformation can spoil that. How does an infinitesimal $dx^a g_{ab}dx^b$ respond when we write in terms of $dy^c$, viz. $dx^a=L^a_{\: c} dy^c$ (say)? Well, obviously the metric tensor updates. And because $v_a:=g_{ab}v^b$ with a coordinate-dependent formula for the $g_{ab}$, we can't just write e.g. $v^a w^a$; we need $v^a w_a=v^a g_{ab}w^b$, whose invariances are easy to work out.
A: Short answer: Given two column vectors (i.e. $(0,1)$ tensors) $x$ and $y$, attempting to contract $x^iy^i$ amounts to making sense of the matrix product $x\cdot y$. It just doesn't work.
A: Well, you can contract two upper or two lower indices if you like. The problem is that the result will then be dependent on the co-ordinate system that you use, so it will not represent a physically meaningful quantity.
On the other hand, if you start with a (1,1) tensor and you contract the upper index with the lower index, then the dependencies on co-ordinate systems "cancel each other out" and you are left with a quantity that is independent of the co-ordinate system used i.e. a scalar.
To answer the second part of your question, a matrix can be used to represent a (1,1) tensor - a linear function that maps a vector and a co-vector to a scalar. A (0,2) tensor, on the other hand, maps a pair of vectors to a scalar so you can think of it as a covector, each component of which is another covector.
