Each of you geometries is within a list, so you are effectively passing a list of lists as a geometry to GeoDataFrame. You have to pass a list-like of geometries, not lists.
Using apply you can get the actual geometry out of the list.
b = gpd.GeoDataFrame(a[['a', 'b']], geometry=a['c'].apply(lambda x: x)
Read the documentation of VRT https://gdal.org/drivers/raster/vrt.html and add color table. Step by step example:
Create test image with gdal_create https://gdal.org/programs/gdal_create.html#gdal-create. Utility is included in GDAL version 3.2 and higher.
gdal_create -of GTiff -outsize 10 10 -bands 1 -burn 2 -ot Float32 float_gray.tif
Create a VRT from ...
Easy Python solution for you. Only requires the installation of GeoPandas. Just substitute your filepaths and run this script.
inputFile = '/home/lpowalka/Documents/dane/prg/Województwa_pop.shp'
outputFile = '/home/lpowalka/Documents/dane/prg/Województwa_pop_new.shp'
df = geopandas.read_file(inputFile)
zfactor = 0.3048
df.geometry = df....