надеть - близко накинуть. "на" означает установить фиксированную внешнюю границу для объекта, обосабливающую его от внешнего окружения.
одеть - изменить положение объекта на внутреннее, близко по семантике к "вдеть".

Так штаа, для шапки возможны оба варианта и употребление одного из вариантов является лишь делом привычки в рамках той или иной языковой группы.
Скажем "надеть бескозырку или тюбетейку" более правильно, ибо она нахлобучивается сверху.
А вот норковую шапку можно и "одеть", поскольку голова как бы влезает внутрь шапки..:улыб:

Главное не имя, главное - как оно произнесено