- Patterns in [`Alternatives`](http://reference.wolfram.com/mathematica/ref/Alternatives.html) are tried in order
- Only the first pattern that matches is "applied" to the expression.
- `Cases` does not support multiple patterns outside of `Alternatives`.

I suppose it could be interesting to debate that design decision but nevertheless that's the way it works at this time.

You could of course search with multiple passes:

 expr = f[x, g[y], z]
 pat = h_[c_] | h_[c_, __] | h_[__, c_, __] | h_[__, c_];

 Join @@ (Cases[expr, # :> h -> c, {0, -1}] & /@ List @@ pat)

> {g -> y, f -> x, f -> g[y], f -> z}

Or using `ReplaceList` and `Level`:

 rules = # :> h -> c & /@ List @@ pat
 Join @@ (ReplaceList[#, rules] & /@ Level[expr, {0, -1}])

Since neither of these is efficient you could subvert the normal evaluation by using side-effects, e.g. with `Condition`:

 Module[{f},
 Scan[(f[#] := 1 /; Sow[h -> c]) &, pat];
 Reap[Scan[f, expr, {0, -1}]][[2, 1]]
 ]

> {g -> y, f -> x, f -> g[y], f -> z}

Or much more cleanly, though perhaps rather enigmatically, using `Alternatives` and `Cases`:

 Reap[Cases[expr, pat :> 1 /; Sow[h -> c], {0, -1}];][[2, 1]]

> {g -> y, f -> x, f -> g[y], f -> z}