With the battle engine Pokémon currently has, we'd need to start with something simple like
>>36865546 (two moves per turn) and or movepool changes.
The basic setup I'd like to see going for is to make different "levels" of Legendary battle boosts depending on the power bracket or plot relevance of the Legendary. No matter the boosts chosen they wouldn't be as strong against let's say an Articuno compared to Dialga.
Legendaries would get 2/+ moves per turn, `a-la-Golden Sun bosses, and some of their volatile / invisible stats should be scaled up with the party's level or performance (for example, lowering the chance to get secondary effects applied from moves, lowering the HP loss from PSN/BRN). Even, to better cover against the simplicity of the bad type matching problem, "flatten" their inefficacy in the type chart from 1/2x to say 2/3x (so a Legendary's move that you'd normally block to 1/4x == 25% you can instead only block up to 4/9x ~ 45%). Given them soft enrage timer-like abilities where if after an amount of time they can't get past a specific wall of inconvenient type combo, their stats are increased severely for a couple of turns. Give them two or three phases like with FF bosses where their stats and counters reset, allowing for a more dynamic engagement where you can't just sit back and wait them out to faint. And make the capture (where it is desired) dependent on an engagement dynamic such as using items as distractions against them or setting up Pokémon with specific moves to block their attacks as you look for an opening to toss the ball while they are distracted/flinched.
None of that would really need strong changes to the current engine, they'd mostly be an expansion of the double/triple battle system except only "one" mon of the team of two or three phases shows, and some sort of weather-like effect only for that battle sets up their heightened stats, etc.
Basically something simple like this.