shapes returns an iterable of tuples with geometry and value, you can use geopandas to parse the geometry into a valid geojson.
import geopandas as gpd
from rasterio import features
With gdal and numpy the following is possible assuming the images are the same size (rows and columns) and have the same CRS (e.g. 10m bands from a Sentinel 2 scene).
import numpy as np