Вихованець юнацьких команд «Відрадний» (Київ), «Зміна-Оболонь» та «Дніпро» Д, з 2005 року — гравець дублюючого складу «Дніпра».
7 квітня 2007 року у віці 16 років та 4 місяців дебютував у вищій лізі Чемпіонату України в матчі проти алчевської «Сталі», який закінчився поразкою дніпропетровців з рахунком 1:3. За наступні три сезони Шахов провів за «Дніпро» 24 матчі у вищій лізі і відзначився одним голом.
Проте в більшості ігор футболіст виходив лише у кінцівці матчу на останніх хвилини, тому у березні 2010 року перейшов на умовах оренди до кінця сезону в київський«Арсенал». На 20-й хвилині першого ж матчу за нову команду Шахов забив свій перший гол у її складі, відзначившись у воротах львівських «Карпат» 13 березня 2010 року.
Перед початком сезону 2010—2011 повернувся до табору дніпропетровської команди і за наступні два сезони зіграв ще у 36 матчах чемпіонату, проте так і не зміг зайняти місце в основному складі і 20 червня 2012 року Шахов знову був відданий в оренду до «Арсеналу» до кінця року[2].
На початку 2013 року повернувся в «Дніпро», але знову не зміг виграти конкуренцію за місце в основному складі.
23 квітня 2015 року вийшов на заміну в матчі-відповіді чвертьфіналу Ліги Європи проти бельгійського «Брюгге» і на 84-ій хвилині забив єдиний гол в матчі, забезпечивши перший в історії вихід своєї команди до півфіналу будь-якого з Єврокубків.
ПАОК
6 червня 2016 року було офіційно оголошено про перехід Шахова до складу грецького«ПАОКа»[3]. Відіграв у Греції три сезони, у кожному з яких незмінно вигравав Кубок країни, а в останньому з них виграв також і Грецьку Суперлігу.
«Лечче»
Влітку 2019 року відмовився від подовження контракту з ПАОКом, натомість на правах вільного агента уклав контракт з італійським «Лечче», яке уперше з 2012 року повернулося до елітного італійського дивізіону. Протягом сезону взяв участь у 24 з 38 матчів своєї команди у чемпіонаті, відзначившись одним голом.
АЕК
«Лечче» не зміг зберегти місце у найвищому італійському дивізіоні, і перед початком сезону 2020/21 клуб і гравець домовились про розірвання контракту. У вересні 2020 Шахов повернувся до Греції, де на правах вільного агента уклав дворічну угоду зі столичним клубом АЕК[4]. За грецьку команду виступав упродовж двох сезонів, провівши за неї 48 матчів у грецькій Суперлізі, в яких відзначився чотирма влучними ударами.
З 2007 року став гравцем збірної України (U-19), у складі якої став чемпіоном Європи 2009 року. Щоправда, Шахов не був включений до списку з 18 гравців для участі у фінальній частині чемпіонату, що проходила у Донецьку і Маріуполі. Однак після стартового матчу турніру, в ході якого важкі травми отримали оборонець Сергій Люлька та півзахисник Віталій Віценець, був дозаявлений до складу збірної на турнірі[5]. Загалом взяв участь у трьох з п'яти матчах української збірної у фінальній частині чемпіонату, включаючи півфінал і фінал.
30 липня 2009 року в ході півфінального матчу проти сербських однолітків Шахов уперше в турнірі вийшов на поле у стартовому складі команди і відзначився забитим голом вже на 48-й секунді, пробивши з лінії карного майданчику після невдалого відбиття м'яча воротарем супротивника.
10 серпня 2010 року дебютував в складі молодіжної збірної України в товариському матчі проти молодіжної збірної Казахстану, яка завершилась перемогою українців з рахунком 4-1, а Шахов відіграв на полі весь матч. Загалом протягом трьох років взяв участь у 21 матчі української «молодіжки».