Shackleton started his career at Leeds United's youth academy. He made his U23 debut at the start of the 2016/2017 season. In October 2016, former academy director Neil Redfearn praised him as one of the most promising talents at the club. In the summer of 2017, Shackleton signed a two-year professional contract with Leeds United. On 8 May 2018, he was named in Leeds' first team squad by head coach Paul Heckingbottom for their post-season friendlies tour to Myanmar. He made his first start for Leeds' first team in a pre-season friendly 1–1 draw against York City on 20 July 2018, under recently appointed Leeds' head coach Marcelo Bielsa. During the pre-season, Shackleton found himself played in a right wing-back position, as opposed to the central midfielder role he had otherwise typically occupied. On 26 July 2018, Shackleton was given the number 46 shirt for the upcoming 2018–19 season for Leeds. His first call up to a senior first team match was on 11 August 2018, when he was named on the bench against Derby County; he made his debut in the 4–1 win coming on as a substitute. On 13 August 2018, two days after his professional debut, Shackleton signed a three-year contract extension with Leeds United. On 14 August, Shackleton made his first ever start for Leeds, starting for Leeds in an EFL Cup match against Bolton Wanderers. Exactly one week later, he made his full league debut, starting at right back away to Swansea City in a 2–2 draw, replacing captain Liam Cooper who had been injured during warm-up, and managing to assist Kemar Roofe for Leeds United's first goal. On 1 March 2019, Shackleton made an appearance as an injury-time substitute playing as an attacking midfielder in the 'number 10' role against West Bromwich Albion, and managed to assist Ezgjan Alioski for the final goal in a 4–0 win. He was one of 3 players nominated for the clubs end of season awards for Young Player Of The Season alongside Tyler Roberts and Jack Clarke, but lost out on the award on 28 April, with Jack Clarke winning the award for Young Player Of The Season at the clubs annual ceremony. During the 2018–19 Leeds United F.C. season, Shackleton played 24 games in all competitions, after Leeds finished the regular season in third place after dropping out of the automatic promotion places with 3 games left after a defeat to 10 man Wigan Athletic on 19 April, Leeds qualified for the playoffs versus sixth-placed Derby County, including Shackleton coming on as a first half substitute for the injured Adam Forshaw in the 1st leg of the playoffs in a 1–0 win at Pride Park into the home leg at Elland Road, Shackleton's impressive performance meant he started the 2nd leg as Leeds lost 2–4 in an encounter that saw Stuart Dallas score a brace in the 2nd leg, with Leeds down to 10 men after the red card of Gaetano Berardi, the loss saw Derby progress 4–3 on aggregate to the final against Aston Villa. Despite being in Marcelo Bielsa's starting XI for much of the beginning of the 2019/20 season, Shackleton became the manager's late-game direct replacement for Pablo Hernández and, to a lesser extent, Mateusz Klich as the season wore on. Named in the starting team against Derby County in the penultimate game of the season on 19 July 2020, Shackleton scored his first league goal for the club at Pride Park in Leeds' 3-1 win, their first game after being confirmed champions of the Championship. Within days he had netted his second goal — against Charlton, which would prove to be Leeds’ final goal scored in the 2019/20 campaign.
Shackleton plays in centre midfield but can also play as a right wing-back. Pacy on the wings, with good crossing ability, he is known as a technical player on the ball who also has a tenacious pressing style off the ball.