Давайте я тоже попробую то же самое рассказать, иногда помогает.
Векторы, ковекторы и разные другие тензоры - они не могут быть "в базисе". Они сами по себе, находятся в соответствующих пространствах. Пространство - оно прекрасно себя чувствует, даже если мы в нем базис не выбрали.
Но раз нам иногда надо что-нибудь считать, то рано или поздно мы в пространстве выберем какой-то базис. И вот в этот момент, и не раньше, у векторов и ковекторов появляются координаты, у операторов и билинейных форм - матрицы, ну и у разных других тензоров тоже появляются компоненты.
Это надо осознать. Тензоры - они сами по себе, а компоненты зависят и от тензора, и от базиса, в котором мы его измеряем. Поэтому если у нас есть разные базисы, то один и тот же тензор в них будет иметь разные компоненты, но раз уж они одному тензору принадлежат, они все-таки между собой связаны.
Теперь про контр-/ковариантность. Как оказывается, основными геометрическими объектами, из которых строятся все остальные, являются векторы и ковекторы. Векторы - это, собственно, элементы пространства, которое мы изучаем, а ковекторы - это их "измерители" - ковектор эта такая штука, которая "ест" вектор и выдает скаляр. Это, собственно, основная связь между векторами и ковекторами, между пространством и сопряженным к нему: мы можем умножить ковектор на вектор и получить скаляр.
В координатах это выглядит так: у вектора есть координаты, которые показывают его проекции на каждое направление, а у ковектора есть координаты, которые дают "цену" единицы каждого направления. В итоге умножение ковектора

на вектор

- это просто свертка

(соглашение о суммировании одинаковых индексов в силе).
Раз векторы и ковекторы у нас таким образом связаны, то понятно, что компоненты у них должны изменяться взаимно обратным образом - если при переходе от одного базиса к другому координаты вектора изменились, то координаты коветора должны измениться так, чтобы в итоге их произведение осталось неизменным. То есть противоположным образом.
Оказывается, что эти два типа преобразования - это, по большому счету, все, что у нас есть. Бывают объекты, которые ведут себя как векторы, а бывают объекты, которые "едят" векторы и ведут себя как ковекторы. Например, линейный оператор "ест" вектор и выдает вектор, поэтому по первому индексу он ведет себя как ковектор, а по второму - как вектор. Билинейная форма "ест" два вектора и выдает скаляр - такие тензоры дважды ковариантны. Билинейные отображения "едят" два вектора и выдают вектор. Ну и так далее.
Теперь про метрический тензор и поднятие/опускание индексов. Метрический тензор - это билинейная форма, он ест два вектора и выдает их скалярное произведение. Но суть в том, что скалярное произведение мы можем зафиксировать. И вот как только мы фиксируем скалярное произведение, мы можем умножать не только ковекторы на векторы, но и векторы друг на друга с помощью

. На это можно посмотреть и вот с какой стороны - мы сначала превращаем вектор в ковектор ("опускаем индекс"):

, а потом умножаем его на вектор

. То есть введение метрического тензора позволяет нам свободно переходить от векторов к ковекторам и обратно (если

, то

, поэтому

). И это все связано с биортогональными базисами. Если нам не хочется рассматривать векторы и ковекторы как элементы разных пространств, то мы можем построить к нашему базису биортогональный и сказать, что ковариантные координаты вектора - это координаты в исходном базисе, а ковариантные - в биортогональном. Я не физик, поэтому мне это кажется неудобным, но, видимо, физикам так удобнее.
(На самом деле метрический тензор - это не обязательно скалярное произведение, он может быть отрицательным, например тот же

в пространстве Минковского. Но это неважно, предыдущий абзац от этого не страдает.)