How to create a panel with different properties for different objects
Easy. You would have to assign the PointerProperty to bpy.types.Object. Use context.object to get a reference. Demo based on the template from How to create a custom UI?
import bpy

from bpy.props import (StringProperty,
                       BoolProperty,
                       IntProperty,
                       FloatProperty,
                       FloatVectorProperty,
                       EnumProperty,
                       PointerProperty,
                       )
from bpy.types import (Panel,
                       Menu,
                       Operator,
                       PropertyGroup,
                       )


# ------------------------------------------------------------------------
#    Object Properties
# ------------------------------------------------------------------------

class MyProperties(PropertyGroup):

    my_bool: BoolProperty(
        name=&quot;Enable or Disable&quot;,
        description=&quot;A bool property&quot;,
        default = False
        )

    my_int: IntProperty(
        name = &quot;Int Value&quot;,
        description=&quot;A integer property&quot;,
        default = 23,
        min = 10,
        max = 100
        )

    my_float: FloatProperty(
        name = &quot;Float Value&quot;,
        description = &quot;A float property&quot;,
        default = 23.7,
        min = 0.01,
        max = 30.0
        )

# ------------------------------------------------------------------------
#    Panel in Object Mode
# ------------------------------------------------------------------------

class OBJECT_PT_CustomPanel(Panel):
    bl_label = &quot;My Panel&quot;
    bl_idname = &quot;OBJECT_PT_custom_panel&quot;
    bl_space_type = &quot;VIEW_3D&quot;   
    bl_region_type = &quot;UI&quot;
    bl_category = &quot;Tools&quot;
    bl_context = &quot;objectmode&quot;   


    @classmethod
    def poll(self,context):
        return context.object is not None

    def draw(self, context):
        layout = self.layout
        #scene = context.scene
        mytool = context.object.my_tool

        layout.prop(mytool, &quot;my_bool&quot;)
        layout.prop(mytool, &quot;my_int&quot;)
        layout.prop(mytool, &quot;my_float&quot;)
        layout.separator()

# ------------------------------------------------------------------------
#    Registration
# ------------------------------------------------------------------------

classes = (
    MyProperties,
    OBJECT_PT_CustomPanel
)

def register():
    from bpy.utils import register_class
    for cls in classes:
        register_class(cls)

    bpy.types.Object.my_tool = PointerProperty(type=MyProperties)

def unregister():
    from bpy.utils import unregister_class
    for cls in reversed(classes):
        unregister_class(cls)
    del bpy.types.Object.my_tool


if __name__ == &quot;__main__&quot;:
    register()