Dependency injection just means that you do not create instances of your dependencies, you get them from somewhere else, whether that means constructor arguments, method arguments, or pulling them out of a container. It is possible, and indeed necessary, for .NET Standard projects. Xamarin.Forms app is a perfect example.
The project you're looking at uses the bait-and-switch technique. What happens is project is compiled several times for different target frameworks, but all have the same assembly name. For each configuration, only certain files are included. For the .NET Standard builds, only the files with a .shared.cs extension are included, for iOS it's the .shared.cs files and FilePickerImplementation.ios.cs, etc. When you add the NuGet package to your solution, each project gets the DLL that matches its own target framework. The .NETStandard DLLs are just placeholders so that your .NETStandard projects can compile, but they would not actually run on their own because there is no implementation of IFilePicker and a NotImplementedException will be thrown when you access CrossFilePicker.Current. However, when you compile the whole solution for iOS, the iOS version of the DLL is used instead of the .NETStandard version so there is an implementation.
You cannot directly reference a binding project from a cross-platform project, that is exactly what dependency injection is for.