Потому что сначала подключаете свой main.css, а потом bootstrap.css. У всех заголовков в бутстрапе верхние отступы сбрасываются в 0, в вашем main.css специфичность у заголовка такая же, в результате стили для него перезаписываются бутстрапом, который подключен
позже кастомного css.
Поменяйте местами импорты CSS:
<link rel="stylesheet" type="text/css" href="src/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="src/main.css">
Другая проблема в том, что даже если margin-top будет работать, отступа от верхнего края карточки всё равно не получится :) Так что здесь действительно лучше использовать padding. Но, по-моему, логичнее его прикрутить к самой карточке, тогда отступ останется, если вы вдруг решите сменить заголовок h2 на что-то другое:
.panel {
padding-top: 10px;
}