The .NET "system" (.NET Framework, .NET Standard, .NET Core, .NET 5) has grown over time, and now consists out of various derivatives (Framework, Standard, Core, .NET 5), API versions (CLR), and versions (.NET Framework 2.0, 3.5, 4.0, 4.5, ...).
As a class library creator for the .NET "system", I want to provide a wide compatibility: my library should be able to be consumed in various derivatives, API versions, and versions, without causing errors/warnings at compile time (e.g. "One or more packages are incompatible...").
My source code is designed to "compile" for .NET Framework 2.0, 3.5, 4.0, 4.5, 4.8, .NET Standard 2.0, .NET Core 2.1, .NET Core 3.1, .NET 5).
Now I want to provide a (NuGet) package that contains a bare minimum .NET targets, but maintains compatibility with all "major" .NET "flavors".
My plan is to provide .NET targets for the first version after a CLR change (.NET Framework 2.0, 4), for .NET Standard 2.0, .NET Core 2.1, .NET Core 3.1, and .NET 5.
My question: Is this target selection sufficient for "maximum" compatibility (starting from CLR 2.0), can some targets be removed from the list, or are there missing targets?
I have digged through the reference @Martheen has provided within his answer.
Based on the following statement from the .NET Standard documentation about which .NET Standard version to be target, I am now using the list below the quote.
However, targeting lower .NET Standard versions introduces a number of support dependencies. If your project targets .NET Standard 1.x, we recommend that you also target .NET Standard 2.0. This simplifies the dependency graph for users of your library that run on .NET Standard 2.0 compatible implementations, and it reduces the number of packages they need to download.
This provides both, compatibility for .NET Framework 2.0 and above, and fewer support dependencies for newer targets (see quote above).