Hall was born in Dudley, West Midlands. He played football in the youth system at Wolverhampton Wanderers before moving to Birmingham City, where he signed his first professional contract at the age of 17. By 18 he was a regular in the reserve team. Birmingham's Academy director Stewart Hall described him as "the outstanding prospect in the under-18 group" and he was expected to challenge for a first team place. In March 2005 he made his debut for England under-19s, and in May, he was named Birmingham's young player of the 2004–05 season. Later that year he played for England under-20s.
Loan spells
Hall made 12 appearances during three months spent on loan at League Two club Boston United in the 2005–06 season. He signed a one-year contract with Birmingham before the 2006–07 season, spent the last month of the season on loan at Ashford Town, and signed a further year's contract with Birmingham before the 2007–08 season. In January 2008, Hall joined Shrewsbury Town of League Two on loan for the remainder of the season. He made his debut for the Shrews on 19 January against Morecambe, and scored the first goal in a 2–0 win. Hall was offered a permanent deal with Shrewsbury by their manager Gary Peters before his sacking in March. In May, when Hall was released by Birmingham, Peters' replacement Paul Simpson also offered him a contract. The player appeared keen to sign but eventually rejected the offer.
Luton Town
Hall signed for Luton Town in August 2008. He was a regular member of the first team, and helped the club reach the 2009 Football League Trophy Final, scoring in the penalty shoot-out to defeat Brighton & Hove Albion in the semi-final. The next season, Hall was again a regular player, though the arrival of Simon Heslop in March saw him demoted to the bench by new Luton manager Richard Money. Hall was released from his Luton contract at the end of the season, having made 89 appearances and scored 17 goals in his time at the club.
Oxford United
On 20 May 2010, Hall signed for Oxford United, newly promoted back to the Football League, on a two-year deal. Hall decided not to renew his contract with Oxford, preferring to return nearer his Midlands home.
Shrewsbury Town
In May 2012, Hall agreed to rejoin Shrewsbury Town in July after his Oxford contract expired, and made his second Shrewsbury debut as a substitute in a League Cup match against Leeds United on 11 August. In February 2013 Hall moved to Aldershot Town on loan; he made 16 league appearances before returning to Shrewsbury at the end of the season. In May 2013, Shrewsbury manager Graham Turner said he intended to talk to Hall about his future with the club, and he was sent on another loan spell at Oxford United on 3 July. Hall returned to Shrewsbury at the end of his loan in January 2014, with Turner indicating he was no longer part of his plans and was available for transfer. Despite this, he was allocated a squad number and appeared as a substitute in Shrewsbury's next match against Leyton Orient. With Turner departing the club later that month, Hall expressed his desire to stay at Shrewsbury and fight for his place, despite interest from his former Oxford manager Chris Wilder to sign him at his new club Northampton Town. Following Shrewsbury's relegation, Hall was released at the end of his contract.
On 28 May 2014, Hall signed for League Two club Cheltenham Town on a two-year contract. He tore his calf four minutes into his debut, and complications from that injury kept him out for a year. On 23 February 2017, Hall joined National League club York City on a one-month loan. On 21 May 2017, he started as York beat Macclesfield Town 3–2 at Wembley Stadium in the 2017 FA Trophy Final. Hall was released by Cheltenham at the end of 2016–17.