This is not going to be a thorough, considered, etc. post, as I am writing what comes to mind, as it comes to mind.
I haven't thought of the subject in quite a while, and wouldn't be posting this either, were it not for the latest episode of Extra Credits (Intrinsic vs. Extrinsic).
(I'm revising what I write as I write it as well, but it's all on the spot. I haven't specifically planned or prepared to write this.
That being the case, I hope that it's adequate to the task.)
Why did I not like Diablo 2?
The biggest reason (which, really, encompass many of the secondary aspects I'll raise,) is that it's mechanically insufficient to the task of letting me apply my personal skill (or lack thereof) to the game, in the game (as opposed to around it).
Subsequently, my engagement in the game suffers immensely.
Also, let me mention this once, because I don't feel like repeating myself as often as this will come up:
Diablo 2 has a problem with... idk, scale, magnitude, scope, somesuch.
Each area is huge. Which, unless utilized, leads to dead space.
Let's simplify things.
Let's assume 30 map-squares per outdoor area. (p.s., in most cases, see above.)
Let's assume 1 spawn-point per map square. (p.s., the number is much higher.)
Let's assume 4 monsters spawn in each spawn-point. Depending on the monster, this varies from 1 to 10ish, but that's more or less the norm, iirc.
Assume there are 15 areas in an act (There are 17 Waypoints per act (act 4 notwithstanding), of which 1 is in town.)
This gives us an extremely under-representative 1800 monsters per area.
(Then multiply this by 3 difficulties.)
If a fight's too easy, you're going to be walking a lot. Yay.
If a fight's too hard, there are going to be a lot of them.
tl;dr - Any combat related issue is either caused by how the game is set up, or exacerbated by it.
The gameplay splits between two main styles, obviously: Melee and ranged.
Ranged itself further splits into physical and magical.
(Melee could have split thus as well, but - in Diablo 2 - it doesn't.)
Let's start with melee, because it suffers from the greatest handicaps.
Let me state the obvious, here.
It's better to block a blow than to take it,
it's better to avoid the blow entirely, than to have to block it.
(I'm not even going to get into things like weapon condition issues like: Blocking must be with the lengthwise rather than edge-on, or you're going to damage your weapon, etc.)
So, you're facing a monster. What options do you have?
1) Footwork and timing. Swing as it's approaching, then manually avoid its return hits (i.e. run away.)
Fine and dandy if you're dealing with a handful of creatures at a time, and can dispatch them swiftly.
In Diablo 2, this is not the case. Not even for a brand new character, fresh to the Blood Moor (when item inflation isn't thrown into the monster-balance mix yet).
2) Active and passive defenses. Wearing armor, parrying with weapons or shields.
Active defenses are near non-existant. There's next to no way to actively block an attack.
(Shield blocking is handled mathematically, positioning can't be used to absorb hits, only to avoid them.)
(Go ahead, try stunning a monster to interrupt its attack. Good. Now enjoy your skill lockout.),
and passive defenses are both boring (due to being both purely mathematical and purely in the background) and subject to the Random Number God.
3) Terrain. Traps. Ambush.
Terrain is nearly a non-factor (Doorways are good, Act 3 rivers are a PitA. The occasional unpassable doodad is useless.)
Traps can be set, but given the magnitude of each of the game's areas... Time investment vs. return makes this abhorrent.
And ambush... There's only 1 way to kind of pull this off: Dim Vision.
Oh, and have I mentioned that the monsters can see you through walls?
Footwork requires delicate control.
Furthermore, it requires exponentially more invested control the more opponents you're facing simultaneously.
(It also requires space to maneuver in, which you only have by backpedalling through cleared areas. And then you need to advance again.)
Diablo 2 doesn't allow such, due to Z-shift on mouse position and frame-based animation.
Passive defenses are boring, because they are completely uninteractive.
Active defenses are mechanically problematic.
(Reaction time + animation speed = gl blocking stuff. Avoidance is easier.)
Terrain, as stated, usually has no effect,
traps are less time-efficient than just wading in and smashing, so unless monsters are scary, traps are prohibitively expensive (in terms of time vs. progress).
(And if monsters are scary, you're hobbling melee characters.
Ambush, as stated, is not mechanically supported.
Second, the AI.
Monsters usually limit themselves to 2 things:
Stand back and shoot/blast/whatever, or rush in by the directest route possible.
The variation is 'coward', of which there are 3.
1) Monster reaches #% HP
2) When another dies
3) When you close into melee range
1 is simply annoying, and doesn't contribute anything of benefit to a fight.
2 allows some added tactical considerations.
3 is put on ranged characters.
The annoying part is that they all tend to move faster than you do. In which case you'd better be able to 1-shot them, disable them or have a ranged option.
While I feel that this is limiting, it isn't actually my main problem.
The problem is that the AI does not take active advantage of any synergy in monster capabilities when they arise.
The only synergy is happy coincidence e.g. melee monster and ranged monster spawn together, melee will bum-rush at you (not that it'll actually try to keep the squishier ranged one safe or anything, but...), or a debuffer happens to attack you at the same time as a monster who benefits from that specific debuff.
There's no emergent tactical play and counterplay. It's not quite static, but the scope of variation is distinctly limited.
Not even going to go into merc and minion AI and (lack of) player direction.
Third, it tries to do SP and MP balance simultaneously, kinda.
I'm not even talking about item drop rates, simply monster stats.
Between the (potential) availability of (not even talking about level-appropriateness) teammates and the fact that you can (again, potentially) trade for powerful items, this rather skews the baseline.
Without even going into the mechanics of specific skills, tl;dr they are - simply put (and with a couple of exceptions) - not interesting to use.
Also, there's several whole sets of skills that obsolete previous skills, e.g. basebolt -> bigbolt -> biggerbolt.
Randomized drops are fine, when appropriate.
But, let's just say that I'm playing in SP and so can't trade, party up, etc. (See 3rd point.)
I'm playing, and come across a situation I can't handle. So I try to upgrade my gear.
The player has next-to-no control over his gear.
There's next to nothing that I can do to make an immediate difference.
Add in the fact that there are bloated affix pools competing randomly for a limited number of slots on an item, and... Ugh.
Not even going to talk about engine limitations.
e.g. frame animation vis-a-vis F_R, i.e. arcane, opaque animation breakpoints.
The game's 13 years old, after all.
There's more I could say, or in more specific detail, but this (textwall) should be enough to get the idea across, I think.