There are 2 ways to share code as you state. The PCL approach and using file linking (cloned).
With file linking, you normally use #if
directives to specify platform specific features in your core. Like:
#if MONOANDROID
var androidGlobal = this.GetService<Cirrious.MvvmCross.Droid.Interfaces.IMvxAndroidGlobals>();
_geo = new Geolocator(androidGlobal.ApplicationContext);
#else
_geo = new Geolocator();
#endif
With PCL projects, you would typically create an interface, then create separate platform specific implementations.
So you may have an ILocationWatcher
in your PCL core project. Then you can create a WinPhone.LocationWatcher
and Droid.LocationWatcher
in each of the platform projects.
Usually you would use some sort of Inversion of Control (IoC) container to register the patform specific type at startup. Then your Core project would get an instance, either via dependency injection or resolving via the IoC container. Your core PCL would program strictly against the interface and not have to worry about the specific implementation.
This is how MvvmCross plugins work. Pretty much all the plugins come with a core interface and a platform specific implementation.