You can use a shell script or a symlink to the main executable, or the AppRun provided by AppImageKit. It really doesn’t matter as long as your AppRun file or symlink is capable of launching the main payload application correctly.
Using the AppRun provided by AppImageKit takes care of launching the payload application for you in many cases, so it can save you from doing manual boilerplate code.
The AppRun file has nothing to do with the update mechanism. From our side we consider the AppRun provided by AppImageKit to be feature complete; if people have additional requirements they are welcome to write their own AppRun file (or extend the one in AppImageKit).
Not needed, since the only requirement of an AppRun file or symlink is to launch the main payload application. Every additional feature is a “specialty” of the respective AppImage and not something that all AppImages will (or should) support.
Code that should be common to all AppImages does not go into AppRun, but into runtime.c.
These are not handled by AppRun but by runtime.c.
Remember that AppRun is an AppDir thing (predating AppImage and useable outside of AppImages) while runtime.c is an additional thing introduced by AppImage.