The output group provider is also treated specially in some cases, like for validation actions:
The way I think of this is "how do you tell bazel which files in a target to build". There are a few (sometimes overlapping) mechanisms:
1. DefaultInfo(files=...) -- These are the files that are built when a target is named on the command line
2. Implicit outputs -- These are additional files from a target that can be named on the command line or used in dependencies (e.g. the _deploy.jar output of java_binary)
3. Output groups -- This is how you can ask for a whole class of outputs to be built in addition to the normal outputs (e.g. the dSYMs mentioned above, source jars for java targets)
That output groups is a provider seems more like an implementation detail. And as Keith said, output groups can have just (nested sets / depsets of) files, whereas providers can have files, depsets, lists, strings, ints, structs, other providers