As for joining the shapefile - once digested by the {sf} package, e.g. via sf::st_read() call from a tempdir or what not - there should be no shiny specific issues: a code that runs in your R local session should run the same in a shiny app (my suggestion for joining by a common key would be start with your shapefile and do a dplyr::left_join() using a common key; that way the resulting object will inherit the "special sauce" (= sticky geometry) from your first argument.