You can use a vertex group to store the selected vertices and then assign the Instance on Points node's Selection socket to display the instances corresponding to each vertex and have a modal operator in the background listen to the vertices selected.


This is the sample modal operator that when run, will listen in the background of all selected vertices.
import bpy import bmesh import re class OBJECT_OT_VertexSelectionModalOperator(bpy.types.Operator): bl_idname = "wm.vertex_selection_modal_operator" bl_label = "Vertex Selection Modal Operator" bl_options = {'INTERNAL', 'UNDO'} _timer = None _handler = None _last_selected_indices = set() @classmethod def is_running(cls): return cls._handler is not None def modal(self, context, event): obj = context.object if not obj or obj.type != 'MESH' or obj.mode != 'EDIT': return {'PASS_THROUGH'} if event.type == 'TIMER': self.update_vertex_data(context) return {'PASS_THROUGH'} def invoke(self, context, event): cls = self.__class__ if cls._handler is not None: return {'CANCELLED'} wm = context.window_manager if cls._timer is None: cls._timer = wm.event_timer_add(0.01, window=context.window) wm.modal_handler_add(self) cls._handler = self return {'RUNNING_MODAL'} def set_selected_vertices(self, obj, vertex_group): node_tree = next((nt for nt in bpy.data.node_groups), None) mod = next((m for m in obj.modifiers if m.type == 'NODES' and m.node_group == node_tree), None) for key in mod.keys(): match = re.match(r"(.+)_attribute_name$", key) if match: base_socket_name = match.group(1) attribute_toggle_key = f"{base_socket_name}_use_attribute" if attribute_toggle_key in mod.keys(): mod[attribute_toggle_key] = True mod[key] = vertex_group def assign_vertices_to_group_in_edit_mode(self, obj, vg_name, vertex_indices, weight=1.0): bm = bmesh.from_edit_mesh(obj.data) vg = obj.vertex_groups.get(vg_name) or obj.vertex_groups.new(name=vg_name) if not bm.verts.layers.deform: deform_layer = bm.verts.layers.deform.new() else: deform_layer = bm.verts.layers.deform.active for v in bm.verts: if vg.index in v[deform_layer]: del v[deform_layer][vg.index] for i in vertex_indices: if i < len(bm.verts): bm.verts[i][deform_layer][vg.index] = weight bmesh.update_edit_mesh(obj.data) obj.data.update() def update_vertex_data(self, context): obj = context.object if obj is None or obj.type != 'MESH' or obj.mode != 'EDIT': return bm = bmesh.from_edit_mesh(obj.data) bm.verts.ensure_lookup_table() selected_verts = [v.index for v in bm.verts if v.select] if set(selected_verts) != self._last_selected_indices: self._last_selected_indices = set(selected_verts) self.assign_vertices_to_group_in_edit_mode(obj, "selected_vertices", selected_verts) def register(): bpy.utils.register_class(OBJECT_OT_VertexSelectionModalOperator) def unregister(): bpy.utils.unregister_class(OBJECT_OT_VertexSelectionModalOperator) if __name__ == "__main__": register() bpy.ops.wm.vertex_selection_modal_operator('INVOKE_DEFAULT')