I played a lot of competitive Pokémon for many years and my thoughts are some of this isn't right, but it depends strongly on your goals, because some types look a lot stronger than they are based on the environment you're in.
How minmaxed will this campaign end up being? How focused on defense will it end up being? Is it doubles or singles?
I disagree with nerfing Electric defensively. There are very few strong defensive Electric Pokémon. Electric is a nice type to have on some defensive Pokémon (e.g. 4th gen Rotom formes, Zapdos historically - which already suffered from its Rock weakness), because it doesn't really add many more weaknesses. But Earthquake has always been one of the best moves in the game (that's why most of the best Electrics are immune to it). Electric Pokémon are otherwise almost always glass cannons or understatted pseudo-glass cannons. They die pretty easily to STAB neutral moves. But in the normal games they seem more robust than they are because things aren't efficiently statted and Pokémon use suboptimal moves.
They also already suck against many Rock Pokémon. Ignoring the Rock Pokémon that don't have Ground as a secondary type, most of the rest still get access to a good Ground move. Rock-types also on average tend to have decent Special Defense (which is boosted very high in competitive settings by sand - something to consider for your Rock NPCs), so Electrics have trouble taking them out before they get killed anyway.
Rock is a pretty bad type though, and could use buffing. It suffers a lot because most Rock-types are defensively statted, but they have maybe the worst defensive weaknesses in the game. They boast soaring high DEF scores, but get smashed through by strong Fighting-types anyway - and Ground-types! (Earthquake is again a very strong move that non-Ground-types take for coverage. I assume in a campaign like this you will restrict access to some moves based on base power and stuff like that?) There are better answers to Flying-types. The best Rock-types have good secondary typings that neutralise their weaknesses to these attacks, or are otherwise busted (Tyranitar - Rock/Dark is great offensive typing, its abilities are excellent, its stats are excellent and let it take a lot of even super effective hits - especially after the Special Defense buff granted to Rock-types in sand -, its movepool is excellent, etc.; Rhyperior wasn't amazing, but its ability helped it cope with Water and Grass attacks, and Rock/Ground are super good coverage to have; Diancie is super strong in every way and a Fairy to boot, which is also a complementary typing). Rock is a Defensive archetype with offensive strengths, it works awkwardly and I think if you were going to change a type's weaknesses you should do it to Rock instead to help it cope with more Pokémon, or focus on their offensive capacities.
Ice definitely needs buffing. I think those buffs are fine and make especially Water/Ice Pokémon quite good. Ice is a really good offensive typing and it just needs to not get smashed by literally everything and not stonewalled by Water, one of the most ubiquitous types in the game - which you nailed. The thing about Pokémon is there are types that are really good offensively and suck defensively (Rock, Ice, Electric even) and what happens is Pokémon with good typing just use their moves as coverage. Maybe too much coverage is an early balancing problem that presents specialisation (this is something that differs between settings - in the video games, most Pokémon DON'T have access to strong cross-type moves in their movepool at a low level, so there's more reason to use specific types).
Steel should absolutely not be weak to Dragon. It is one of the only balancing features against Dragon. The games were dominated by Dragons completely until the introduction of the Fairy-type, which brought about a new paradigm. Dragons are strong in every attribute including type, their moves are powerful and hit everything neutrally except Steel (and themselves for SE) which is really, really good if you have good stats. Steel also becomes pretty much unusable if it can't do anything against the best Pokémon in the game because it has really nothing much going for it. Steel Pokémon have good stats but as we see with Rock-types, good defensive stats mean little if you don't have the typing to back it up (although depending on the damage formula you use, maybe that could be different). They have shallow movepools and almost universally very bad offensive stats and speed. Most Steel Pokémon are actually pretty bad. Dark/Ghost resistance is nothing in exchange for its Dragon resistance.
It might help to target or restrict access to some of the outliers that you feel upste the balance. Not all Pokémon are made equal at battling. And in general, improving coverage of your NPCs is better than across the board nerfs if you're using real Pokémon.
Btw I bring up competitive because D&D can be very exploitable in a similar way and the environment is something of your own making, and using the strongest Pokémon helps make you aware of their flaws. It may be that the math you use for calculating e.g. damage completely changes how you should be treating types as well.
I would be careful about changing the typing table too much because most people are pretty familiar with it as a core mechanic, and it is actually as imbalanced as it seems, most of the imbalance comes from the distribution of stats and abilities within the typings. There are a few obviously broken types (Dragon, Fairy; Rock, Ice).